"""
演示Python的socket编程_服务器端开发
"""

import socket

# 创建socket服务对象
socket_server = socket.socket()
# 绑定socker服务的IP和端口
address = ("127.0.0.1", 8888)
socket_server.bind(address)
# 监听端口
# listen方法内接收一个整数参数，表示接收的链接数量
socket_server.listen(1)
print(f"服务端已启动，监听在{address[0]}的{address[1]}端口上，等待客户端连接...")
# 等待客户端链接
# accept方法返回的是一个二元元组（链接对象，客户端地址信息）
# accept方法是阻塞式方法
# result = socket_server.accept()
# conn = result[0]        # 客户端和服务端的链接对象
# client_address = result[1]     # 客户端的地址信息
# 以上代码可以简写为：
conn, client_address = socket_server.accept()

print(f"接收到了客户端链接，客户端的信息是：{client_address}")

while True:
    # 接受客户端信息,这里要使用的客户端和服务端的本次链接对象,而不是socket_server对象
    # recv接受的参数是缓冲区的大小，一般给1024即可
    # recv方法的返回值是一个字节数组，即bytes对象，不是字符串，所以可以通过decode方法，通过UTF-8编码，将字节数组转换为字符串对象
    data = conn.recv(1024).decode("UTF-8")

    print(f"客户端发来的消息是：{data}")
    if data == "exit":
        print("客户端断开与服务端的连接")
        break

    # 发送回复信息
    msg = input("请输入你要向客户端回复的消息：")
    conn.send(msg.encode("UTF-8"))
    if msg == "exit":
        print("服务端断开与客户端的连接")
        break

# 关闭链接
conn.close()
socket_server.close()
